/**
 *	 * visual = new VisualLoader();
	 * visual.addEventListener(Event.COMPLETE,complete);
	 * visual.load("assert/pic.jpg","jpg"); 
 */

package org.zengrong.net {
	import flash.display.*;
	import flash.events.*;
	import flash.net.*;
	import flash.system.LoaderContext;
	import flash.utils.ByteArray;
	
	import org.zengrong.assets.AssetsType;

	[Event(name="complete",type="flash.events.Event")]
	[Event(name="ioError",type="flash.events.IOErrorEvent")]
	[Event(name="progress",type="flash.events.ProgressEvent")]
	
	/**
	 * 此类用于载入单个外部可视化资源,转AS支持的资源的功能
	 * 获取class与bitmapData数据
	 * 注：异步处理，需载入完成才能获取资源
	 * 
	 **/
	public class VisualLoader extends EventDispatcher implements ILoader {
		protected var _loader:Loader;
		protected var _url:String;
		protected var _type:String;
		protected var _loading:Boolean;

		public function VisualLoader(){
			_loading = false;
		}
		
		/**
		 * 初始化,侦听可视对象的Loader 
		 * 给load方法调用
		 */		
		protected function initLoader():void {
			if (_loader == null){
				_loader = new Loader();
				_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handler_complete);
				_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, handler_ioError);
				_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, handler_progress);
			}
		}

		/**
		 * URL地址方法
		 * 从外部URL载入可视对象，可视对象必须是swf、png或者jpg类型。
		 * @param $bytes 要载入的资源文件路径
		 * @param $type  要载入的资源类型
		 **/
		public function load($url:String, $type:String, $loaderContext:LoaderContext = null):void {
			if (_loading) return; //已载入，则不再载入
			
			_loading = true;
			_url = $url;
			_type = $type;
			initLoader();
			
			if (!$loaderContext)
				$loaderContext = new LoaderContext(true);
			_loader.load(new URLRequest($url), $loaderContext);
		}

		/**
		 * 字节数组方法
		 * 字节数组必须是swf、png或者jpg类型。
		 * @param $bytes 要载入的字节数组
		 * @param $type 要载入的字节数组的类型
		 * */
		public function loadBytes($bytes:ByteArray, $type:String, $loaderContext:LoaderContext = null):void {
			if (_loading)
				return;
			_loading = true;
			_type = $type;
			initLoader();
			_loader.loadBytes($bytes, $loaderContext);
		}

		/**
		 * 根据名称获取SWF库中的类资源
		 * 例如MovieClip、Sprite、Bitmap、Sound、Font等。
		 * 只要Flash软件支持的类型，这里都可以获取到。
		 * @throw Error 如果载入的文件不是SWF，则抛出异常。判断文件类型通过AssetsType.SWF属性。
		 * @see org.zengrong.assets.ActorType #SWF
		 */
		public function getClass($className:String):Class {
			if (_loader == null)
				return null;
			if (_type == AssetsType.SWF)
				return _loader.contentLoaderInfo.applicationDomain.getDefinition($className) as Class;
			else
				throw new Error('载入的可视对象不是SWF类型，不能返回Class');
		}

		/**
		 * 载入的图像的BitmapData
		 * 
		 * @see org.zengrong.assets.ActorType#isPic()
		 * @see #_type
		 */
		public function getBitmapData():BitmapData {
			if (_loader == null)
				return null;
			if (AssetsType.isPic(_type)){
				return Bitmap(_loader.content).bitmapData;
			} else
				throw new Error('载入的可视对象不是图像类型，不能返回bitmapData');
		}
		
		/**
		 * _loader 侦听函数 
		 * 派发出事件
		 * @param evt
		 */
		protected function handler_complete(evt:Event):void {
			_loading = false;
			dispatchEvent(evt);
		}

		protected function handler_progress(evt:ProgressEvent):void {
			dispatchEvent(evt);
		}

		protected function handler_ioError(evt:IOErrorEvent):void {
			_loading = false;
			dispatchEvent(evt);
		}
		
		/*getter/setter*/
		public function get type():String {
			return _type;
		}
		
		public function get url():String {
			return _url;
		}
		
		public function get loading():Boolean {
			return _loading;
		}
		
		/**消毁*/
		public function destroy():void {
			if (_loader){
				_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, handler_complete);
				_loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, handler_ioError);
				_loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, handler_progress);
				_loader = null;
			}
		}
	}
}